import Router from 'koa-router';
import {
  ensureUploadDir,
  validateFileType,
  validateFileSize,
  saveUploadedFile
} from '../utils/upload.js';
import path from 'path';

const router = new Router({
  prefix: '/api/upload'
});

// 配置上传参数
const UPLOAD_CONFIG = {
  maxSize: 5 * 1024 * 1024, // 5MB
  allowedTypes: ['.jpg', '.jpeg', '.png', '.gif'],
  uploadDir: path.join(process.cwd(), 'public/uploads')
};

// 确保上传目录存在
ensureUploadDir(UPLOAD_CONFIG.uploadDir);

// 上传单个图片
router.post('/image', async (ctx) => {
  try {
    const file = ctx.request.files?.file;

    // 验证是否有文件上传
    if (!file) {
      ctx.throw(400, '没有上传文件');
    }

    // 验证文件类型
    if (!validateFileType(file, UPLOAD_CONFIG.allowedTypes)) {
      ctx.throw(400, `只支持以下文件类型: ${UPLOAD_CONFIG.allowedTypes.join(', ')}`);
    }

    // 验证文件大小
    if (!validateFileSize(file, UPLOAD_CONFIG.maxSize)) {
      ctx.throw(400, `文件大小不能超过 ${UPLOAD_CONFIG.maxSize / 1024 / 1024}MB`);
    }

    // 保存文件
    const result = await saveUploadedFile(file, UPLOAD_CONFIG.uploadDir);

    // 返回上传结果
    ctx.body = {
      url: result.url,
      fileName: result.fileName,
      originalName: file.originalFilename,
      size: file.size,
      type: file.mimetype
    };
  } catch (error) {
    console.error('文件上传失败:', error);
    ctx.throw(500, '文件上传失败');
  }
});

// 批量上传图片
router.post('/images', async (ctx) => {
  try {
    const files = ctx.request.files?.files;

    // 验证是否有文件上传
    if (!files) {
      ctx.throw(400, '没有上传文件');
    }

    // 转换为数组处理
    const fileArray = Array.isArray(files) ? files : [files];
    
    // 处理每个文件
    const results = await Promise.all(
      fileArray.map(async (file) => {
        // 验证文件类型
        if (!validateFileType(file, UPLOAD_CONFIG.allowedTypes)) {
          throw new Error(`文件 ${file.originalFilename} 类型不支持`);
        }

        // 验证文件大小
        if (!validateFileSize(file, UPLOAD_CONFIG.maxSize)) {
          throw new Error(`文件 ${file.originalFilename} 超过大小限制`);
        }

        // 保存文件
        const result = await saveUploadedFile(file, UPLOAD_CONFIG.uploadDir);

        return {
          url: result.url,
          fileName: result.fileName,
          originalName: file.originalFilename,
          size: file.size,
          type: file.mimetype
        };
      })
    );

    ctx.body = results;
  } catch (error) {
    console.error('批量上传失败:', error);
    ctx.throw(500, error.message || '批量上传失败');
  }
});

export default router;
